package org.mxp.config;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * 延迟配置
 */
@Configuration
public class TtlQueueConfig {
    // 交换机X
    public static final String EXCHANGE_X = "X";
    // 交换机Y（死信交换机）
    public static final String EXCHANGE_Y = "Y";
    // 队列QA
    public static final String QUEUE_QA = "QA";
    // 队列QB
    public static final String QUEUE_QB = "QB";
    // 队列QD（死信队列）
    public static final String QUEUE_QD = "QD";

    // 声明X交换机
    @Bean
    public DirectExchange xExchange(){
        return new DirectExchange(EXCHANGE_X);
    }

    // 声明Y交换机（死信交换机）
    @Bean
    public DirectExchange yExchange(){
        return new DirectExchange(EXCHANGE_Y);
    }

    // 声明队列QA，设置ttl为10s，并绑定到对应的死信交换机Y
    @Bean
    public Queue queueQA() {
        Map<String, Object> args = new HashMap<>(3);
        // 声明当前队列绑定的死信交换机
        args.put("x-dead-letter-exchange", EXCHANGE_Y);
        // 声明当前队列的死信路由key
        args.put("x-dead-letter-routing-key", "YD");
        // 声明队列的TTL，单位ms
        args.put("x-message-ttl", 10000);
        // 固定写法，生成队列
        return QueueBuilder.durable(QUEUE_QA).withArguments(args).build();
    }

    // 声明队列QB，设置ttl为40s，并绑定到对应的死信交换机Y
    @Bean
    public Queue queueQB() {
        Map<String, Object> args = new HashMap<>(3);
        // 声明当前队列绑定的死信交换机
        args.put("x-dead-letter-exchange", EXCHANGE_Y);
        // 声明当前队列的死信路由key
            args.put("x-dead-letter-routing-key", "YD");
        // 声明队列的TTL，单位ms
        args.put("x-message-ttl", 40000);
        // 固定写法，生成队列
        return QueueBuilder.durable(QUEUE_QB).withArguments(args).build();
    }

    // 声明队列QD（死信队列）
    @Bean
    public Queue queueQD() {
        return new Queue(QUEUE_QD);
    }

    // 将队列QA绑定到交换机X，routingKey为XA
    @Bean
    public Binding queueQABindingX(@Qualifier("queueQA") Queue queueQA, @Qualifier("xExchange") DirectExchange xExchange) {
        // 将队列QA绑定到交换机X，并指定路由key为XA
        return BindingBuilder.bind(queueQA).to(xExchange).with("XA");
    }

    // 将队列QB绑定到交换机X，routingKey为XB
    @Bean
    public Binding queueQBBindingX(@Qualifier("queueQB") Queue queueQB, @Qualifier("xExchange") DirectExchange xExchange) {
        // 将队列QB绑定到交换机X，并指定路由key为XA
        return BindingBuilder.bind(queueQB).to(xExchange).with("XB");
    }

    // 将队列QD（死信队列）绑定到交换机Y（死信交换机），routingKey为YD
    @Bean
    public Binding queueQDBindingY(@Qualifier("queueQD") Queue queueQD, @Qualifier("yExchange") DirectExchange yExchange) {
        // 将队列QD（死信队列）绑定到交换机Y（死信交换机），并指定路由key为YD
        return BindingBuilder.bind(queueQD).to(yExchange).with("YD");
    }
}
